import core from '@/core/'

// 拾取经纬度的地址
const positionUrl = 'https://lbs.qq.com/tool/getpoint/index.html'

// 点击了拾取经纬度
const onPosition = () => {
	core.common.openLink(positionUrl)
}

// 点击了导航
const openLocation = (params) => {
	const {
		latitude, // 纬度，浮点数，范围为90 ~ -90
		longitude, // 经度，浮点数，范围为180 ~ -180。
		name, // 位置名
		address, // 地址详情说明
		scale = 18, // 缩放比例，范围5~18，默认为18
		infoUrl = core.store.domain, // 在查看位置界面底部显示的超链接,可点击跳转
		success = (res) => {
			// console.log(res)
		},
		error = (err) => {
			// console.log(err)
		},
		fail = (err) => {
			// console.log(err)
		},
		complete = (res) => {
			// console.log(res)
		}
	} = params
	params.latitude = parseFloat(params.latitude)
	params.longitude = parseFloat(params.longitude)
	if (core.store.device.info.apply_code === 'wx_h5') {
		core.wechat.openLocation(params)
	} else {
		uni.openLocation(params)
	}
}

// 地理编码
const geocoder = () => {
	
}

// 逆地理编码
const regeocoder = (latitude, longitude) => {
	return core.request.fetchData('map', 'regeocoder', {latitude, longitude})
}

// 记录获取位置的方法。在获取位置后执行
var getInfo = {
	res: undefined,
	error: undefined,
	action: undefined
}
// 获取当前位置 - 得到经纬度
const getLocation = ({type = 'wgs84', altitude, geocode, isHighAccuracy, highAccuracyExpireTime = 0, success, fail} = {}) => {
	
	if (core.user.position.authorize.status === 0) { // 未获取位置。需要获取
		core.user.position.authorize.status = 2
		
		const params = {
			type, // 默认为 wgs84 返回 gps 坐标，gcj02 返回国测局坐标，可用于 uni.openLocation 和 map 组件坐标，App 和 H5 需配置定位 SDK 信息才可支持 gcj02。
			altitude, // 传入 true 会返回高度信息，由于获取高度需要较高精确度，会减慢接口返回速度
			geocode, // 是否解析地址信息。仅app支持
			isHighAccuracy, // 开启高精度定位
			highAccuracyExpireTime, // 高精度定位超时时间(ms)，指定时间内返回最高精度，该值3000ms以上高精度定位才有效果
			success: (res) => {
				const {
					latitude, // 纬度，浮点数，范围为90 ~ -90
					longitude, // 经度，浮点数，范围为180 ~ -180。
					speed, // 速度，以米/每秒计
					accuracy, // 位置精度
					altitude, // 当前高度
					verticalAccuracy, // 垂直精度
					horizontalAccuracy, // 水平精度
					address = {}, // 地址信息。仅app支持
				} = res
				const {
					country = '', // 国家
					province = '', // 省份
					city = '', //城市
					district = '', // 区县
					street = '', // 街道信息
					streetNum = '', // 门牌号信息
					poiName = '', // POI信息。如“电子城．国际电子总部”
					postalCode = '', // 邮政编码
					cityCode = '', // 城市代码
				} = address
				console.log('位置获取成功：')
				console.log(res)
				console.log('当前纬度：' + latitude)
				console.log('当前经度：' + longitude)
				console.log('当前速度：' + speed)
				console.log('当前位置精度：' + accuracy)
				console.log('当前高度：' + altitude)
				console.log('当前垂直精度：' + verticalAccuracy)
				console.log('当前水平精度：' + horizontalAccuracy)
				
				// 根据经纬度，进行逆地理编码
				regeocoder(latitude, longitude).then(res => {
					if (res && res.data)  {
						// 授权的位置是否变化，以乡镇为最终标准
						let bool = true
						const {city_code, county_code, town_code, formatted_address} = core.user.position.authorize
						if (town_code) {
							if (town_code === res.data.town_code) {
								bool = false
							}
						} else if (county_code) {
							if (county_code === res.data.county_code) {
								bool = false
							}
						} else if (city_code) {
							if (city_code === res.data.city_code) {
								bool = false
							}
						}
						if (formatted_address !== res.data.formatted_address) {
							Object.keys(res.data).forEach(key => {
								core.user.position.authorize[key] = res.data[key]
							})
						}
						console.log('位置信息获取成功：' + bool)
						// 将当前授权的位置信息执行初始化
						core.user.location_intial('authorize', res.data)
						console.log('位置信息状态：' + core.user.position.authorize.status)
						success && success(res.data)
						getInfo.action && getInfo.action({res: res.data})
					}
				}).catch(error => {
					core.user.position.authorize.status = 0
					fail && fail(error)
					getInfo.action && getInfo.action({error})
				})
			}, 
			fail: (error) => {
				core.user.position.authorize.status = 0
				fail && fail(error)
				getInfo.action && getInfo.action({error})
				if (bool) {
					// 调系统位置
					uni.getLocation(params)
				}
			},
			error: (error) => {
				core.user.position.authorize.status = 0
				fail && fail(error)
				getInfo.action && getInfo.action({error})
				if (bool) {
					// 调系统位置
					uni.getLocation(params)
				}
			},
			complete: (res) => {
				console.log(res)
			},
		}
		
		if (core.isDevelopment || 1) {
			// 开发模式，执行模拟情况
			params.success({
				latitude: 22.953484,
				longitude: 113.894149
			})
		} else {
			if (!core.isDevelopment && core.store.device.info.apply_code === 'wx_h5' && core.user.third.openid) {
				// 调微信H5的位置
				core.wechat.getLocation(params).then(res => {
					console.log('调微信位置成功：')
					console.log(res)
				}).catch(err => {
					// 调系统位置
					uni.getLocation(params)
				})
			} else {
				/**
				 * 调系统位置
				 * 调微信小程序的位置
				 */
				uni.getLocation(params)
			}
		}
	} else if (core.user.position.authorize.status === 1) { // 已获取位置，直接返回
		success && success()
	} else if (core.user.position.authorize.status === 2) { // 正在获取中
		if (getInfo.error) {
			fail && fail(getInfo.error)
		} else if (getInfo.res) {
			success && success(getInfo.res)
		} else {
			getInfo.action = ({res, error}) => {
				if (error) {
					fail && fail(error)
					getInfo.error = error
				} else {
					success && success(res)
					getInfo.res = res
				}
			}
		}
	}
}

module.exports = {
	// 点击了拾取经纬度
	onPosition,
	// 点击了导航
	openLocation,
	// 逆地理编码
	regeocoder,
	// 地理编码
	geocoder,
	// 申请定位
	applyGetPosition({
		handy = true, // 是否只需要简单的城市定位，不需要用户授权也可完成；城市定位，只能获取到省份和城市信息，城市编码，大概的经纬度（经测试偏差比较远）
		title = '申请获取您的位置', 
		content = '让您时刻享受周边的服务信息', 
		success, // handy为true，获取城市定位的成功回调；为false获取经纬度后的回调
		force, // 是否强制执行。
	} = {}) {
		return new Promise((resolve, reject) => {
			getLocation({
				success: (res) => {
					resolve(res)
				},
				fail: reject
			})
		})
	}
}